package com.cjy.queueArray;

/**
 * @Author Giles
 * @Date 2022/6/19 15:52
 * @Version 1.0
 */
public class SparesArray {
    public static void main(String[] args) {
        // 创建一个 11*11的二维数组作为棋盘
        // 0表示该位置没有棋子 ，1为黑子 2为白子
        int[][] chessArr = new int[11][11];
        // 模拟有效值的位置
        chessArr[1][2] =1;
        chessArr[2][3] =2;
        chessArr[4][6] =1;
        // 将该棋盘打印出来
        for (int[] row : chessArr) {
            for (int data : row) {
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

        // 🐳将二维数组 转化为 稀疏数组
        // 1.遍历获取二维数组的有效值个数sum
        int sum =0;
        for (int i =0; i<11 ; i++ ){
            for (int j = 0;  j < 11; j++) {
                if (chessArr[i][j] != 0){
                    sum++;
                }
            }
        }
        // 2.创建对应的稀疏数组 (本质上稀疏数组也是一个二维数组，但是固定为了三列)
        int sparseArr[][]=new int[sum+1][3];
        // 3.给稀疏数组的第一行赋值 ；表示原来二维数组的大小
        sparseArr[0][0] =11;
        sparseArr[0][1] =11;
        sparseArr[0][2] =sum;
        // 4.遍历二维数组，将非0的值（有效值）存放到sparseArr中
        // 6.创建计数器 自增对应稀疏数组记录有效值的列位
        int count =0;
        for (int i =0; i<11; i++){
            for(int j =0 ; j< 11 ;j++){
                if (chessArr[i][j]!=0){
                    // 🐳5.难点在这里，那么稀疏数组中怎么去表示在第几行去保存值呢？
                    // sparseArr[?][0] = i; 问号需要递增，所以需要计数器
                    count ++;
                    sparseArr[count][0]=i;
                    sparseArr[count][1]=j;
                    sparseArr[count][2]=chessArr[i][j];
                }
            }
        }
        // 看稀疏数组的效果
        System.out.println("得到稀疏数组~~");
        for (int z =0; z<sparseArr.length;z++){
            // 格式化打印
            System.out.printf("%d\t%d\t%d\t\n",sparseArr[z][0],sparseArr[z][1],sparseArr[z][2]);
        }
        System.out.println();
        // 【作业】7、使用对象流将数组存储到文件中


        // 【将稀疏数组转化为二维数组】
        // 1、先读取稀疏数组第一行，初始化出一个二维数组（一个多少行多少列的二维数组）
        int chessArrNew[][] = new int[sparseArr[0][0]][sparseArr[0][1]];
        // 2、从第二行开始读取稀疏数组，获取有效值的位置并对初始化的二维数组进行赋值
        for(int i= 1; i<sparseArr.length ; i++){
            chessArrNew [sparseArr[i][0]] [sparseArr[i][1]] = sparseArr[i][2];
        }
        // 【作业】3、使用对象流将数组存储到文件中

        // 打印出来验证一下
        System.out.println("恢复后的二维数组");
        for (int[] row : chessArrNew) {
            for (int data : row) {
                System.out.printf("%d\t",data);
            }
            System.out.println();
        }

    }
}
